/**
 * 格式化日期时间
 * @param {string|Date} date - 日期时间字符串或Date对象
 * @param {string} format - 格式，默认 'YYYY-MM-DD HH:mm:ss'
 * @returns {string} 格式化后的日期时间字符串
 */
export function formatDateTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
  if (!date) {
    return ''
  }

  try {
    // 如果已经是格式化好的字符串（格式：YYYY-MM-DD HH:mm:ss），直接返回
    if (typeof date === 'string') {
      // 检查是否是已格式化的字符串（不包含T和Z，且符合格式）
      if (!date.includes('T') && !date.includes('Z') && /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/.test(date)) {
        return date
      }
    }

    let d
    if (date instanceof Date) {
      d = date
    } else if (typeof date === 'string') {
      // ISO格式字符串（包含T或Z），转换为Date对象
      d = new Date(date)
      // 检查日期是否有效
      if (isNaN(d.getTime())) {
        return date // 如果无法解析，返回原字符串
      }
    } else {
      return String(date)
    }

    // 转换为Asia/Shanghai时区（UTC+8）
    // 获取UTC时间戳
    const utcTimestamp = d.getTime()
    // 获取本地时区偏移（分钟）
    const localOffset = d.getTimezoneOffset() * 60000
    // 计算UTC时间
    const utcTime = utcTimestamp + localOffset
    // 转换为上海时区（UTC+8 = +8小时 = 28800000毫秒）
    const shanghaiOffset = 8 * 3600000
    const shanghaiTime = new Date(utcTime + shanghaiOffset)
    
    const year = shanghaiTime.getFullYear()
    const month = String(shanghaiTime.getMonth() + 1).padStart(2, '0')
    const day = String(shanghaiTime.getDate()).padStart(2, '0')
    const hours = String(shanghaiTime.getHours()).padStart(2, '0')
    const minutes = String(shanghaiTime.getMinutes()).padStart(2, '0')
    const seconds = String(shanghaiTime.getSeconds()).padStart(2, '0')

    return format
      .replace('YYYY', year)
      .replace('MM', month)
      .replace('DD', day)
      .replace('HH', hours)
      .replace('mm', minutes)
      .replace('ss', seconds)
  } catch (error) {
    console.error('日期格式化错误:', error, date)
    return String(date)
  }
}

/**
 * 格式化日期
 * @param {string|Date} date - 日期字符串或Date对象
 * @param {string} format - 格式，默认 'YYYY-MM-DD'
 * @returns {string} 格式化后的日期字符串
 */
export function formatDate(date, format = 'YYYY-MM-DD') {
  return formatDateTime(date, format)
}

/**
 * 格式化时间
 * @param {string|Date} time - 时间字符串或Date对象
 * @param {string} format - 格式，默认 'HH:mm:ss'
 * @returns {string} 格式化后的时间字符串
 */
export function formatTime(time, format = 'HH:mm:ss') {
  return formatDateTime(time, format)
}

/**
 * 格式化相对时间
 * @param {string|Date} date - 日期时间字符串或Date对象
 * @returns {string} 相对时间字符串（如：刚刚、5分钟前、2小时前等）
 */
export function formatRelativeTime(date) {
  if (!date) {
    return ''
  }

  try {
    const now = new Date()
    const target = date instanceof Date ? date : new Date(date)
    const diff = Math.floor((now - target) / 1000) // 秒数差

    if (diff < 60) {
      return '刚刚'
    } else if (diff < 3600) {
      return `${Math.floor(diff / 60)}分钟前`
    } else if (diff < 86400) {
      return `${Math.floor(diff / 3600)}小时前`
    } else if (diff < 2592000) {
      return `${Math.floor(diff / 86400)}天前`
    } else {
      return formatDateTime(date)
    }
  } catch (error) {
    console.error('相对时间格式化错误:', error, date)
    return formatDateTime(date)
  }
}

